#include <iostream>
#include <signal.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>


void divZero()
{
    int a= 10, b = 0;
    int ret = a/b;
}

void wildPtr()
{
    int* p = nullptr;
    *p = 10;
}

void handler(int sig)
{
    std::cout << "get a sig: " << sig << std::endl;
}

int main()
{
    pid_t id = fork();
    if (id == 0)
    {
        // child
        divZero();
    }

    // 父进程等待
    int status = 0;
    int ret = waitpid(id, &status, 0);
    if (ret > 0)
    {
        printf("exit code:%d, exit sig:%d, core dump:%d\n", (status>>8)&0xff, status&0x7f, (status>>7)&0x1);
    }
    return 0;
}
// int main()
// {
//     // signal(SIGFPE, handler);
//     // signal(SIGSEGV, handler);
//     divZero();
//     // wildPtr();
//     return 0;
// }

// int count = 1; // 记录1s可以打印多少信息
// void handler(int sig)
// {
//     std::cout << "get a sig: " << sig << std::endl;
//     alarm(1);
// }

// int main()
// {
//     signal(SIGALRM, handler);
//     alarm(1);
//     while(1)
//     {
//         sleep(1);
//         std::cout << "hello signal, pid: " << getpid() << std::endl;
//     }
//     return 0;
// }
// int main()
// {
//     // 捕捉31个信号
//     for (int i = 0; i <= 31; i++)
//         signal(i, handler);
//     while(1)
//     {
//         sleep(2);
//         std::cout << "hello signal, pid: " << getpid() << std::endl;
//     }
//     return 0;
// }
// int main()
// {
//     std::cout << "pid: " << getpid() << std::endl;
//     signal(6, handler);
//     while(1)
//     {
//         sleep(1);
//         std::cout << "hello signal, pid: " << getpid() << std::endl;
//         abort();
//     }
//     return 0;
// }


// int main()
// {
//     // signal(2, handler);
//     int count = 0;
//     while(1)
//     {
//         sleep(1);
//         std::cout << "hello signal, pid: " << getpid() << "count: " << count << std::endl;
//         if (++count == 10)
//         {
//             std::cout << "count: " << count << " exit" << std::endl;
//             // raise(2);
//             abort();
//         }
//     }
//     return 0;
// }